
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2008, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Test object.
//
///////////////////////////////////////////////////////////////////////////////

#include "TestObject.h"

#include "Usul/Preprocess/UniqueName.h"
#include "Usul/Strings/Format.h"
#include "Usul/System/Sleep.h"

#include <iostream>

USUL_IMPLEMENT_TYPE_ID ( TestObject );


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

TestObject::TestObject() : BaseClass(),
  _data ( 1 )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

TestObject::~TestObject()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the data.
//
///////////////////////////////////////////////////////////////////////////////

unsigned int TestObject::getData() const
{
  ReadLock lock ( this );
  return _data;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the data.
//
///////////////////////////////////////////////////////////////////////////////

void TestObject::setData ( unsigned int data )
{
  WriteLock lock ( this );

  _data = data;

  // Handle overflow.
  if ( 0 == _data )
  {
    _data = 1;
  }
}


///////////////////////////////////////////////////////////////////////////////
//
//  Exercise the locks.
//
///////////////////////////////////////////////////////////////////////////////

void TestObject::exercise()
{
  for ( unsigned int i = 0; i < 5; ++i )
  {
    {
      for ( unsigned int j = 0; j < i + 1; ++j )
      {
        WriteLock USUL_UNIQUE_NAME ( this );
      }
    }
    Usul::System::Sleep::milliseconds ( 10 );
    {
      for ( unsigned int j = 0; j < i + 1; ++j )
      {
        ReadLock USUL_UNIQUE_NAME ( this );
      }
    }
  }
}
